package com.hengpeng.itfin.service.account;

import java.util.List;

import com.hengpeng.itfinbase.persist.Account;
import com.hengpeng.itfinbase.persist.AccountLog;
import com.hengpeng.itfinbase.persist.AccountLog.TradeMode;
import com.hengpeng.itfinbase.persist.AccountLog.TransType;

/**
 * <pre>
 * 资金账户,资金日志服务类
 * </pre>
 * @author weiyuan
 * @version 1.0, 2015年5月30日
 */
public interface AccountService
{
	/**
	 * <pre>
	 * 锁定指定用户的账户信息
	 * </pre>
	 * @param userId
	 * @param isLock
	 * @return
	 */
	public Account lockAccount(Long userId);

	/**
	 * <pre>
	 * 用户资金账户交易变动：加钱,减钱,冻结,解冻
	 * </pre>
	 * @param userId 用户id
	 * @param totalMoney 交易总金额
	 * @param baseMoney 交易金额中本金金额
	 * @param interestMoney 交易金额中利息金额
	 * @param transType 交易业务类型
	 * @param tradeMode 交易模式
	 * @param referenceId 关联业务id
	 * @param remark 备注
	 */
	public void changeAccountMoney(Long userId, Long totalMoney, Long baseMoney, Long interestMoney,
			AccountLog.TransType transType, AccountLog.TradeMode tradeMode, String referenceId, String remark);

	/**
	 * <pre>
	 * 用户资金账户交易变动：加钱,减钱,冻结,解冻
	 * </pre>
	 * @param userId 用户id
	 * @param money 交易金额
	 * @param transType 交易业务类型
	 * @param tradeMode 交易模式
	 * @param referenceId 关联业务id
	 * @param remark 备注
	 */
	public void changeAccountMoney(Long userId, Long money, AccountLog.TransType transType,
			AccountLog.TradeMode tradeMode, String referenceId, String remark);

	/**
	 * <pre>
	 * 放款操作资金账户
	 * </pre>
	 * @param userId
	 * @param totalMoney
	 * @param baseMoney
	 * @param interestMoney
	 * @param transType
	 * @param tradeMode
	 * @param referenceId
	 * @param remark
	 * @param addTotal
	 */
	public void loansChangeAccountMoney(Long userId, Long totalMoney, Long baseMoney, Long interestMoney,
			TransType transType, TradeMode tradeMode, String referenceId, String remark, boolean addTotal);

	/**
	 * 冻结资金
	 * @param userId
	 * @param transType
	 * @param money
	 * @param referenceId
	 * @param remark
	 */
	public void freeze(Long userId, TransType transType, Long money, String referenceId, String remark);

	/**
	 * 事件完成，解冻并扣款
	 * @param userId
	 * @param transType
	 * @param money
	 */
	public void unfreezeForSuc(Long userId, TransType transType, Long money, String referenceId, String remark);

	/**
	 * 事件失败解冻资金
	 */
	public void unfreezeForFail(Long userId, TransType transType, Long money, String referenceId, String remark);

	/**
	 * 加钱操作
	 * @param userId
	 * @param transType
	 * @param money
	 * @param referenceId
	 * @param remark
	 */
	public void add(Long userId, TransType transType, Long money, String referenceId, String remark);

	/**
	 * 直接扣款（不冻结）
	 * @param userId
	 * @param transType
	 * @param money
	 * @param referenceId
	 * @param remark
	 */
	public void subtractNoFreeze(Long userId, TransType transType, Long money, String referenceId, String remark);

	/**
	 * <pre>
	 * 资金账户查询
	 * </pre>
	 * @param userId
	 * @return
	 */
	public Account getAccount(Long userId);

	/**
	 * <pre>
	 * 查询平台账户
	 * </pre>
	 * @return
	 */
	public List<Account> queryPlatFormList();
}
